package br.ufg.inf.espweb.sgca.web.listener;

import br.ufg.inf.espweb.sgca.model.Usuario;
import br.ufg.inf.espweb.sgca.web.controller.AutenticacaoController;
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;

/**
 *
 * @author diCastro
 */
public class AutenticationListener implements PhaseListener {
    
    @Override
    public void afterPhase(PhaseEvent event) {
        //obtem o contexto atual
        FacesContext context = event.getFacesContext();
        
        //obtem a página atual que está interagindo com o clico de vida do JSF
        String paginaAtual = context.getViewRoot().getViewId();
        
        //se for a página inicial de login seta a variável como true
        boolean isLoginPage = paginaAtual.contains("login");
        
        //obtem a sessão atual
        HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
        
        if(session==null){
            return;
        }
        
        AutenticacaoController autenticacaoController = (AutenticacaoController) session.getAttribute("autenticacaoCtrl");
        
        NavigationHandler nh = context.getApplication().getNavigationHandler();
        if(autenticacaoController == null){
            
            if(isLoginPage){
                return;
            } else {
                nh.handleNavigation(context, null, "loginFail");
                return;
            }
        }
        
        Usuario usuario = autenticacaoController.getUsuario();
        if(!isLoginPage && usuario == null){
            //se o usuario for null, ele não está logado, então redireciona para a página inicial de login
            session.removeAttribute("usuario");
            session.removeAttribute("autenticacaoCtrl");
            session.invalidate();
            nh.handleNavigation(context, null, "loginFail");
        } else if(isLoginPage && usuario != null){
            //se o usuario for diferente de null, o usuário está logado
            //se tentar acessar a página de login é redirecionado para página de bem vindo
            nh.handleNavigation(context, null, "loginSucesso");
        }
    }
    
    @Override
    public void beforePhase(PhaseEvent pe) {
        
    }
    
    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }
    
}
